{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>x1</th>\n",
       "      <th>x2</th>\n",
       "      <th>y</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.065735</td>\n",
       "      <td>0.044223</td>\n",
       "      <td>0.006277</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.049985</td>\n",
       "      <td>0.334657</td>\n",
       "      <td>0.114494</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.541525</td>\n",
       "      <td>0.027610</td>\n",
       "      <td>0.294011</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.038182</td>\n",
       "      <td>0.284811</td>\n",
       "      <td>0.082575</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.262401</td>\n",
       "      <td>0.198246</td>\n",
       "      <td>0.108156</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>495</th>\n",
       "      <td>0.343548</td>\n",
       "      <td>0.500284</td>\n",
       "      <td>0.368309</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>496</th>\n",
       "      <td>0.259262</td>\n",
       "      <td>0.558471</td>\n",
       "      <td>0.379106</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>497</th>\n",
       "      <td>0.297697</td>\n",
       "      <td>0.123911</td>\n",
       "      <td>0.103977</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>498</th>\n",
       "      <td>0.507976</td>\n",
       "      <td>0.304445</td>\n",
       "      <td>0.350726</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>499</th>\n",
       "      <td>0.396284</td>\n",
       "      <td>0.607128</td>\n",
       "      <td>0.525645</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>500 rows × 3 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "           x1        x2         y\n",
       "0    0.065735  0.044223  0.006277\n",
       "1    0.049985  0.334657  0.114494\n",
       "2    0.541525  0.027610  0.294011\n",
       "3    0.038182  0.284811  0.082575\n",
       "4    0.262401  0.198246  0.108156\n",
       "..        ...       ...       ...\n",
       "495  0.343548  0.500284  0.368309\n",
       "496  0.259262  0.558471  0.379106\n",
       "497  0.297697  0.123911  0.103977\n",
       "498  0.507976  0.304445  0.350726\n",
       "499  0.396284  0.607128  0.525645\n",
       "\n",
       "[500 rows x 3 columns]"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data_tr = pd.read_csv('BPdata_tr.txt')\n",
    "data_tr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 神经网络输入\n",
    "net_in = np.array([0.0499853495508432,0.334657078469172,-1])\n",
    "\n",
    "# 输出层的输入\n",
    "out_in = np.array([0.00,0,0,0,-1])\n",
    "\n",
    "# 隐藏层的权值和阈值 初始化\n",
    "w_mid = np.zeros([3,4])\n",
    "\n",
    "# 输出层的权值和阈值  初始化\n",
    "w_out = np.zeros([5])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 定义激活函数 sigmoid\n",
    "def sigmoid(x):\n",
    "    return 1/(1+np.exp(-x))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 从输入层 到 隐藏层的 传输过程\n",
    "for i in range(4):\n",
    "    out_in[i] = sigmoid(sum(net_in*w_mid[:,i]))\n",
    "out_in"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 从隐藏层 到 输出层\n",
    "res = sigmoid(sum(out_in*w_out))\n",
    "res "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 输出层权值和阈值的 修正量  初始化\n",
    "delta_w_out = np.zeros([5])\n",
    "\n",
    "# 隐藏层权值和阈值的 修正量  初始化\n",
    "delta_w_mid = np.zeros([3,4])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 学习率\n",
    "yita = 0.5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 真实值\n",
    "real = 0.114493895339242"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 输出层 权值 的 修正量\n",
    "delta_w_out = yita*res*(1-res)*(real-res)*out_in\n",
    "\n",
    "# 输出层 阈值 的 修正量\n",
    "delta_w_out[4] = -yita*res*(1-res)*(real-res)\n",
    "\n",
    "# 反向传播BP算法 调节 输出层权值和阈值更新\n",
    "w_out = w_out + delta_w_out\n",
    "w_out"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "for i in range(4):\n",
    "    # 隐藏层 权值 的 修正量\n",
    "    delta_w_mid[:,i]=yita*out_in[i]*(1-out_in[i])*w_out[i]*res*(1-res)*(real-res)*net_in\n",
    "    # 隐藏层 阈值 的 修正量\n",
    "    delta_w_mid[2,i]=-yita*out_in[i]*(1-out_in[i])*w_out[i]*res*(1-res)*(real-res)\n",
    "    \n",
    "# 反向传播BP算法 调节 隐藏层权值和阈值\n",
    "w_mid = w_mid + delta_w_mid\n",
    "w_mid"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#单个样本的全连接神经网络训练\n",
    "#单个样本的全连接神经网络训练\n",
    "for j in range(1000):\n",
    "    #前向输出\n",
    "    for i in range(4): # 从输入层 到 隐藏层的 传输过程\n",
    "        out_in[i] = sigmoid(sum(net_in*w_mid[:,i]))   \n",
    "    res = sigmoid(sum(out_in*w_out)) # 从隐藏层 到 输出层  \n",
    "    \n",
    "    print(\"第%d 轮的神经网络的输出为:\"%j,res)\n",
    "    \n",
    "    #BP反向调参  \n",
    "    delta_w_out = yita*res*(1-res)*(real-res)*out_in# 输出层 权值 的 修正量\n",
    "    delta_w_out[4] = -yita*res*(1-res)*(real-res) # 输出层 阈值 的 修正量\n",
    "    w_out = w_out + delta_w_out  # 反向传播BP算法 调节 输出层权值和阈值更新\n",
    "    \n",
    "    for i in range(4):\n",
    "        # 隐藏层 权值 的 修正量\n",
    "        delta_w_mid[:,i]=yita*out_in[i]*(1-out_in[i])*w_out[i]*res*(1-res)*(real-res)*net_in\n",
    "        # 隐藏层 阈值 的 修正量\n",
    "        delta_w_mid[2,i]=-yita*out_in[i]*(1-out_in[i])*w_out[i]*res*(1-res)*(real-res)\n",
    "    w_mid = w_mid + delta_w_mid# 反向传播BP算法 调节 隐藏层权值和阈值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#全样本网络100次训练\n",
    "n = len(data_tr)\n",
    "#每一轮训练所有样本的平均损失\n",
    "Err=[]\n",
    "#网络超参数\n",
    "#学习率\n",
    "yita=1.5\n",
    "#最大迭代次数\n",
    "max_iter = 100\n",
    "\n",
    "#全样本训练max_iter轮\n",
    "for it in range(max_iter):\n",
    "    #在每一轮训练中单个样本的损失\n",
    "    error=[]\n",
    "    \n",
    "    #单个样本训练\n",
    "    for j in range(n):\n",
    "    \n",
    "        #网络输入\n",
    "        net_in= np.array([data_tr.iloc[j,0],data_tr.iloc[j,1],-1])\n",
    "        real=data_tr.iloc[j,2]\n",
    "    \n",
    "        #前向输出\n",
    "        for i in range(4): # 从输入层 到 隐藏层的 传输过程\n",
    "            out_in[i] = sigmoid(sum(net_in*w_mid[:,i]))   \n",
    "        res = sigmoid(sum(out_in*w_out)) # 从隐藏层 到 输出层  \n",
    "    \n",
    "#    print(\"第%d 个样本的数据神经网络的输出为:\"%j,res，\"真实值：\",real)#打印输出\n",
    "    \n",
    "        #print(\"第%d 个样本的数据神经网络的输出为:\"%j,(abs(real-res)))\n",
    "        error.append(abs(real-res))\n",
    "    \n",
    "        #BP反向调参  \n",
    "        delta_w_out = yita*res*(1-res)*(real-res)*out_in# 输出层 权值 的 修正量\n",
    "        delta_w_out[4] = -yita*res*(1-res)*(real-res) # 输出层 阈值 的 修正量\n",
    "        w_out = w_out + delta_w_out  # 反向传播BP算法 调节 输出层权值和阈值更新\n",
    "    \n",
    "        for i in range(4):\n",
    "            # 隐藏层 权值 的 修正量\n",
    "            delta_w_mid[:,i]=yita*out_in[i]*(1-out_in[i])*w_out[i]*res*(1-res)*(real-res)*net_in\n",
    "            # 隐藏层 阈值 的 修正量\n",
    "            delta_w_mid[2,i]=-yita*out_in[i]*(1-out_in[i])*w_out[i]*res*(1-res)*(real-res)\n",
    "        w_mid = w_mid + delta_w_mid# 反向传播BP算法 调节 隐藏层权值和阈值\n",
    "       # print(\"第%d 个样本的数据神经网络的输出与真实值损失为:\"%j,(abs(real-res)))\n",
    "    Err.append(np.mean(error))\n",
    "#画图\n",
    "plt.plot(Err)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([-2.30522091, -2.30522091, -2.30522091, -2.30522091, -3.87417865]),\n",
       " array([[-1.60393472, -1.60393472, -1.60393472, -1.60393472],\n",
       "        [-1.59469229, -1.59469229, -1.59469229, -1.59469229],\n",
       "        [-1.22957961, -1.22957961, -1.22957961, -1.22957961]]))"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "w_out,w_mid"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0.013164975850178118, 0.02255972218566138, 0.023074048718250764, 0.13443976227258403, 0.00024838343948918595, 0.20089130443673076, 0.02183974341076883, 0.005309287227701853, 0.0215005842747589, 0.036297520033194766, 0.02611943588531429, 0.08417689750986079, 0.024006941250436148, 0.04749676951030374, 0.02159734801794888, 0.024320124916059532, 0.06842483646160102, 0.17934150051328485, 0.042002412096035224, 0.02418066580554351, 0.04271740556206538, 0.02462728757549186, 0.0255233965876015, 0.009348979467735719, 0.034586990169873266, 0.022066199513314178, 0.010655771415505055, 0.030757521758868367, 0.015653025763393225, 0.04167596222328723, 0.05436973664707195, 0.030956090215645257, 0.09669477593650921, 0.04764958014961007, 0.05659154993146592, 0.009469469359301375, 0.2155061531549316, 0.024853998792679244, 0.02401222523188995, 0.018901982311746834, 0.10625741535234873, 0.07949938389254319, 0.1430660135383306, 0.09981520699703217, 0.023874558668511875, 0.027641457527230788, 0.006900121170319684, 0.034125349123430807, 0.03938171202789363, 0.020192077700760924, 0.02780028771001225, 0.013341640881795347, 0.13786981629020237, 0.06754075733518922, 0.023579864857556046, 0.011708028499079925, 0.03361121272961118, 0.12676727217787692, 0.05703291032151811, 0.021810685683186865, 0.03043670749307592, 0.014675484848707676, 0.040138361665941646, 0.030734933318447413, 0.022509983726898858, 0.01130299005199703, 0.045491976185466354, 0.007353302574085813, 0.03526924080014893, 0.0005230017102411944, 0.0009717992211879523, 0.028825853333714707, 0.012001595717315128, 0.03908621280868457, 0.0556844709897954, 0.014195506969877869, 0.04500178914661768, 0.09759198167116034, 0.039532206436263824, 0.009073264166922224, 0.0276930910518665, 0.032992381328122766, 0.033502397335051004, 0.06997632471712456, 0.014803273194762517, 0.07887190384090997, 0.03612014150246262, 0.02758798536395879, 0.11285182379982617, 0.06985205588610094, 0.03530404123188682, 0.01921730999962945, 0.019883126346177837, 0.01023934608546151, 0.019921103071279922, 0.005910724246046106, 0.018183221527923843, 0.0034794877657460255, 0.03591859161574687, 0.034188849759087835]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "测试集数据的误差均值： 0.042463239805738476\n"
     ]
    }
   ],
   "source": [
    "'''\n",
    "应用训练好的神经网络来预测\n",
    "将测试数据集放入训练好的网格中\n",
    "'''\n",
    "data_te=pd.read_csv('BPdata_te.txt')#导入测试数据\n",
    "#存储每一个测试样本的损失（真实值与预测值的差值的绝对值）\n",
    "error_te=[]\n",
    "#训练样本个数\n",
    "n_te=len(data_te)\n",
    "\n",
    "#单个样本训练\n",
    "for j in range(n_te):\n",
    "    #网络输入\n",
    "    net_in= np.array([data_te.iloc[j,0],data_te.iloc[j,1],-1])\n",
    "    real=data_te.iloc[j,2]\n",
    "\n",
    "    #前向输出\n",
    "    for i in range(4): # 从输入层 到 隐藏层的 传输过程\n",
    "        out_in[i] = sigmoid(sum(net_in*w_mid[:,i]))   \n",
    "    res = sigmoid(sum(out_in*w_out)) # 从隐藏层 到 输出层  \n",
    "\n",
    "    #print(\"第 %d 个测试样本的网络的输出为:\"%j,res，\"真实值：\",real)#打印输出\n",
    "    #print(\"第%d 个样本的数据神经网络的输出为:\"%j,(abs(real-res)))\n",
    "    error_te.append(abs(real-res))\n",
    "print(error_te)\n",
    "#画图\n",
    "plt.plot(error_te)\n",
    "plt.show()\n",
    "print(\"测试集数据的误差均值：\",np.mean(error_te))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
